[IA64] Code clean up using xen machine vector.
authorAlex Williamson <alex.williamson@hp.com>
Tue, 8 May 2007 16:48:39 +0000 (10:48 -0600)
committerAlex Williamson <alex.williamson@hp.com>
Tue, 8 May 2007 16:48:39 +0000 (10:48 -0600)
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c
linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h

index bc17a0ffffc0ad653785bb1df81cde86a34e7d14..5a9db93417311f16861957ebcbfb77161d7415ea 100644 (file)
@@ -514,6 +514,69 @@ void xen_smp_intr_init(void)
 #endif /* CONFIG_SMP */
 }
 
+void
+xen_irq_init(void)
+{
+       struct callback_register event = {
+               .type = CALLBACKTYPE_event,
+               .address = (unsigned long)&xen_event_callback,
+       };
+
+       xen_init_IRQ();
+       BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
+       late_time_init = xen_bind_early_percpu_irq;
+#ifdef CONFIG_SMP
+       register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
+#endif
+}
+
+void
+xen_platform_send_ipi(int cpu, int vector, int delivery_mode, int redirect)
+{
+       int irq = -1;
+
+#ifdef CONFIG_SMP
+       /* TODO: we need to call vcpu_up here */
+       if (unlikely(vector == ap_wakeup_vector)) {
+               extern void xen_send_ipi (int cpu, int vec);
+
+               /* XXX
+                * This should be in __cpu_up(cpu) in ia64 smpboot.c
+                * like x86. But don't want to modify it,
+                * keep it untouched.
+                */
+               xen_smp_intr_init_early(cpu);
+
+               xen_send_ipi (cpu, vector);
+               //vcpu_prepare_and_up(cpu);
+               return;
+       }
+#endif
+
+       switch (vector) {
+               case IA64_IPI_VECTOR:
+                       irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR];
+                       break;
+               case IA64_IPI_RESCHEDULE:
+                       irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR];
+                       break;
+               case IA64_CMCP_VECTOR:
+                       irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR];
+                       break;
+               case IA64_CPEP_VECTOR:
+                       irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
+                       break;
+               default:
+                       printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
+                              vector);
+                       irq = 0;
+                       break;
+       }               
+       
+       BUG_ON(irq < 0);
+       notify_remote_via_irq(irq);
+       return;
+}
 #endif /* CONFIG_XEN */
 
 void
@@ -541,21 +604,6 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
 void __init
 init_IRQ (void)
 {
-#ifdef CONFIG_XEN
-       /* Maybe put into platform_irq_init later */
-       if (is_running_on_xen()) {
-               struct callback_register event = {
-                       .type = CALLBACKTYPE_event,
-                       .address = (unsigned long)&xen_event_callback,
-               };
-               xen_init_IRQ();
-               BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
-               late_time_init = xen_bind_early_percpu_irq;
-#ifdef CONFIG_SMP
-               register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
-#endif /* CONFIG_SMP */
-       }
-#endif /* CONFIG_XEN */
        register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
 #ifdef CONFIG_SMP
        register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
@@ -564,6 +612,10 @@ init_IRQ (void)
        pfm_init_percpu();
 #endif
        platform_irq_init();
+#ifdef CONFIG_XEN
+       if (is_running_on_xen() && !ia64_platform_is("xen"))
+               xen_irq_init();
+#endif
 }
 
 void
@@ -574,52 +626,11 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
        unsigned long phys_cpu_id;
 
 #ifdef CONFIG_XEN
-        if (is_running_on_xen()) {
-               int irq = -1;
-
-#ifdef CONFIG_SMP
-               /* TODO: we need to call vcpu_up here */
-               if (unlikely(vector == ap_wakeup_vector)) {
-                       extern void xen_send_ipi (int cpu, int vec);
-
-                       /* XXX
-                        * This should be in __cpu_up(cpu) in ia64 smpboot.c
-                        * like x86. But don't want to modify it,
-                        * keep it untouched.
-                        */
-                       xen_smp_intr_init_early(cpu);
-
-                       xen_send_ipi (cpu, vector);
-                       //vcpu_prepare_and_up(cpu);
-                       return;
-               }
-#endif
-
-               switch(vector) {
-               case IA64_IPI_VECTOR:
-                       irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR];
-                       break;
-               case IA64_IPI_RESCHEDULE:
-                       irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR];
-                       break;
-               case IA64_CMCP_VECTOR:
-                       irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR];
-                       break;
-               case IA64_CPEP_VECTOR:
-                       irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
-                       break;
-               default:
-                       printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
-                              vector);
-                       irq = 0;
-                       break;
-               }               
-       
-               BUG_ON(irq < 0);
-               notify_remote_via_irq(irq);
+       if (is_running_on_xen()) {
+               xen_platform_send_ipi(cpu, vector, delivery_mode, redirect);
                return;
-        }
-#endif /* CONFIG_XEN */
+       }
+#endif
 
 #ifdef CONFIG_SMP
        phys_cpu_id = cpu_physical_id(cpu);
index a16c393f75cddee321d5f7798e268d82fba734f5..c7af364b420d5bf1a9cfe776fc1c4ff796f0e9e7 100644 (file)
@@ -603,7 +603,10 @@ setup_arch (char **cmdline_p)
 
        platform_setup(cmdline_p);
 #ifdef CONFIG_XEN
-       xen_setup();
+       if (!is_running_on_xen() && !ia64_platform_is("xen")) {
+               extern ia64_mv_setup_t xen_setup;
+               xen_setup(cmdline_p);
+       }
 #endif
        paging_init();
 #ifdef CONFIG_XEN
@@ -993,12 +996,10 @@ cpu_init (void)
        /* size of physical stacked register partition plus 8 bytes: */
        __get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8;
        platform_cpu_init();
-
 #ifdef CONFIG_XEN
-       /* Need to be moved into platform_cpu_init later */
-       if (is_running_on_xen()) {
-               extern void xen_smp_intr_init(void);
-               xen_smp_intr_init();
+       if (is_running_on_xen() && !ia64_platform_is("xen")) {
+               extern ia64_mv_cpu_init_t xen_cpu_init;
+               xen_cpu_init();
        }
 #endif
 
index 5808a2be71ae27d147f6322200061fe566d991ac..e895ef0d96cbd07b0fb51109d69b31ff435aead1 100644 (file)
@@ -53,9 +53,13 @@ static int p2m_expose_init(void);
 
 EXPORT_SYMBOL(__hypercall);
 
-void
-xen_setup(void)
+void __init
+xen_setup(char **cmdline_p)
 {
+       extern void dig_setup(char **cmdline_p);
+       if (ia64_platform_is("xen"))
+               dig_setup(cmdline_p);
+       
        if (!is_running_on_xen() || !is_initial_xendomain())
                return;
 
@@ -71,6 +75,13 @@ xen_setup(void)
        xen_start_info->console.domU.evtchn = 0;
 }
 
+void __cpuinit
+xen_cpu_init(void)
+{
+       extern void xen_smp_intr_init(void);
+       xen_smp_intr_init();
+}
+
 //XXX same as i386, x86_64 contiguous_bitmap_set(), contiguous_bitmap_clear()
 // move those to lib/contiguous_bitmap?
 //XXX discontigmem/sparsemem
index fc98191b22d0959f8c24b84b6b6068a412c57cfa..aeee02c672edc79e6ea3f9d98ec7fd0b4c4921dc 100644 (file)
@@ -36,7 +36,6 @@
 #ifdef CONFIG_XEN
 extern int running_on_xen;
 #define is_running_on_xen()                    (running_on_xen)
-extern void xen_setup(void);
 #else /* CONFIG_XEN */
 # ifdef CONFIG_VMX_GUEST
 #  define is_running_on_xen()                  (1)
@@ -44,7 +43,6 @@ extern void xen_setup(void);
 #  define is_running_on_xen()                  (0)
 #  define HYPERVISOR_ioremap(offset, size)     (offset)
 # endif /* CONFIG_VMX_GUEST */
-#define xen_setup()                            do { } while (0)
 #endif /* CONFIG_XEN */
 
 #if defined(CONFIG_XEN) || defined(CONFIG_VMX_GUEST)
index cdffdfba5359caabc498eef5a940630f5a6ec480..53eff614a1dae21cd9704980ab5279de1f7dcc2c 100644 (file)
@@ -1,7 +1,10 @@
 #ifndef _ASM_IA64_MACHVEC_XEN_h
 #define _ASM_IA64_MACHVEC_XEN_h
 
-extern ia64_mv_setup_t                 dig_setup;
+extern ia64_mv_setup_t                 xen_setup;
+extern ia64_mv_cpu_init_t              xen_cpu_init;
+extern ia64_mv_irq_init_t              xen_irq_init;
+extern ia64_mv_send_ipi_t              xen_platform_send_ipi;
 extern ia64_mv_dma_alloc_coherent      xen_alloc_coherent;
 extern ia64_mv_dma_free_coherent       xen_free_coherent;
 extern ia64_mv_dma_map_single          xen_map_single;
@@ -19,7 +22,10 @@ extern ia64_mv_dma_mapping_error     xen_dma_mapping_error;
  * the macros are used directly.
  */
 #define platform_name                          "xen"
-#define platform_setup                         dig_setup
+#define platform_setup                         xen_setup
+#define platform_cpu_init                      xen_cpu_init
+#define platform_irq_init                      xen_irq_init
+#define platform_send_ipi                      xen_platform_send_ipi
 #define platform_dma_init                      machvec_noop
 #define platform_dma_alloc_coherent            xen_alloc_coherent
 #define platform_dma_free_coherent             xen_free_coherent